﻿using System;
using System.IO;
using System.Windows.Forms;
using System.Xml;
using System.Xml.Serialization;
using DBConnect;

namespace TISS_Add_in
{
    public static class StatusProtocolo
    {

        public static docTissStatusProtocolo.ws_solicitacaoStatusProtocolo geraSolicStatusProtocolo(long idLote, long codPrestadorOrigem, string regANSDestino)
        {
            docTissStatusProtocolo.ws_solicitacaoStatusProtocolo solicitacao = new TISS_Add_in.docTissStatusProtocolo.ws_solicitacaoStatusProtocolo();
            solicitacao.cabecalho =
                (docTissStatusProtocolo.cabecalhoTransacao)Cabecalho.GeraCabecalho(codPrestadorOrigem, regANSDestino, tipoTransacao.SOLIC_STATUS_PROTOCOLO);

            if (solicitacao.cabecalho != null)
            {
                string numeroProtocolo = Mensagem.numeroProtocolo(idLote)["protocoloRecebimento"].ToString();

                if (numeroProtocolo != "")
                {
                    try
                    {
                        solicitacao.solicitacaoStatusProtocolo = new TISS_Add_in.docTissStatusProtocolo.ct_solicitacaoStatusProtocolo();
                        solicitacao.solicitacaoStatusProtocolo.registroANS = solicitacao.cabecalho.destino.Item.ToString();

                        solicitacao.solicitacaoStatusProtocolo.dadosPrestador = new TISS_Add_in.docTissStatusProtocolo.ct_contratado();
                        solicitacao.solicitacaoStatusProtocolo.dadosPrestador.identificacao =
                            new TISS_Add_in.docTissStatusProtocolo.ct_identificacaoPrestadorExecutante();
                        solicitacao.solicitacaoStatusProtocolo.dadosPrestador.identificacao.Item = solicitacao.cabecalho.origem.Item.ToString();
                        solicitacao.solicitacaoStatusProtocolo.dadosPrestador.identificacao.ItemElementName = TISS_Add_in.docTissStatusProtocolo.ItemChoiceType.codigoPrestadorNaOperadora;

                        solicitacao.solicitacaoStatusProtocolo.dadosPrestador.nomeContratado = Globals.ThisAddIn.PrestadorNome;
                        solicitacao.solicitacaoStatusProtocolo.dataSolicitacao = solicitacao.cabecalho.identificacaoTransacao.dataRegistroTransacao;
                        solicitacao.solicitacaoStatusProtocolo.detalheProtocolo = new string[1];
                        solicitacao.solicitacaoStatusProtocolo.detalheProtocolo[0] = numeroProtocolo;

                        #region Rodapé

                        //Fechando a Mensagem e Serializando em Memória
                        byte bufferMensagem = new byte();
                        XmlSerializer xsMensagem = new XmlSerializer(typeof(docTissStatusProtocolo.ws_solicitacaoStatusProtocolo));
                        Stream streamMensagem = new MemoryStream(bufferMensagem);
                        xsMensagem.Serialize(streamMensagem, solicitacao);
                        streamMensagem.Position = 0;

                        //Fim da Mensagem: HASH
                        solicitacao.hash = AddinUtils.CalculateMD5Hash(streamMensagem);

                        #endregion

                        return solicitacao;
                    }
                    catch (Exception ex)
                    {

                        //MensagemTISS não foi enviada, apagar registro do Banco de Dados
                        Mensagem.mensagemTISS_remove(Convert.ToInt64(solicitacao.cabecalho.identificacaoTransacao.sequencialTransacao));
                        MessageBox.Show("Erro ao gerar Solicitação de StatusProtocolo" + ex.Message, "Mensagem não enviada!", MessageBoxButtons.OK, MessageBoxIcon.Exclamation, MessageBoxDefaultButton.Button1);

                        return null;
                    }
                }
            }
            return null;
        }

        public static void recebeStatusProtocolo(docTissStatusProtocolo.ws_situacaoProtocolo situacaoProtocolo, bool exibeStatusLote)
        {
            foreach (docTissStatusProtocolo.ct_statusLote lote in situacaoProtocolo.situacaoProtocolo.lote)
            {
                long idLote = Convert.ToInt64(CommandLotes.buscaLoteGuiasProtocolo(Globals.ThisAddIn.UsuarioID, situacaoProtocolo.situacaoProtocolo.registroANS, lote.numeroProtocolo)["ID"].ToString());
                statusRecebimento StatusRecebimento = new statusRecebimento();
                switch (lote.status)
                {
                    case TISS_Add_in.docTissStatusProtocolo.st_statusProtocolo.Item1:
                        StatusRecebimento = statusRecebimento.Recebido;
                        break;
                    case TISS_Add_in.docTissStatusProtocolo.st_statusProtocolo.Item2:
                        StatusRecebimento = statusRecebimento.Em_analise;
                        break;
                    case TISS_Add_in.docTissStatusProtocolo.st_statusProtocolo.Item3:
                        StatusRecebimento = statusRecebimento.Liberado_para_pagamento;
                        break;
                    case TISS_Add_in.docTissStatusProtocolo.st_statusProtocolo.Item4:
                        StatusRecebimento = statusRecebimento.Encerrado_sem_pagamento;
                        break;
                    case TISS_Add_in.docTissStatusProtocolo.st_statusProtocolo.Item5:
                        StatusRecebimento = statusRecebimento.Analisado_e_aguardando_liberacao_para_o_pagamento;
                        break;
                    case TISS_Add_in.docTissStatusProtocolo.st_statusProtocolo.Item6:
                        StatusRecebimento = statusRecebimento.Pagamento_efetuado;
                        break;
                    case TISS_Add_in.docTissStatusProtocolo.st_statusProtocolo.Item7:
                        StatusRecebimento = statusRecebimento.Protocolo_nao_localizado;
                        break;
                    // item 8 lote nao enviado 
                }

                
                if (exibeStatusLote)
                {
                    //TODO: OV Quais informações são importantes para o usuário??
                    MessageBox.Show("Número do protocolo: " + lote.numeroProtocolo +
                        "\nSituação do lote: " + StatusRecebimento.ToString() +
                        "\nData de envio do lote: " + lote.dataEnvioLote,
                        "Status do Protocolo", MessageBoxButtons.OK, MessageBoxIcon.Information, MessageBoxDefaultButton.Button1);
                }
                CommandSolicitacao.updateStatusRecebimentoLote(idLote, (DBConnect.statusRecebimento)StatusRecebimento);
                //Insere Status dos Procedimentos do Protocolo no BD
                if (lote.guias != null)
                {
                    foreach (docTissStatusProtocolo.ArrayOfCt_statusLoteDetalheguiaDetalheguia guia in lote.guias)
                    {
                        //Verifica se a Guia tem Glosa
                        foreach (docTissStatusProtocolo.ct_itemSolicitacao procedimento in guia.procedimentosAnalisados)
                        {
                            if (procedimento.glosas != null)
                                CommandGuias.glosaGuia(guia.identificacaoGuia.numeroGuiaPrestador, idLote);
                        }
                        XmlSerializer xs = new XmlSerializer(typeof(docTissStatusProtocolo.ArrayOfCt_statusLoteDetalheguiaDetalheguia));
                        Stream stream = new MemoryStream();
                        xs.Serialize(stream, guia);
                        stream.Position = 0;
                        XmlDocument xdoc = new XmlDocument();
                        xdoc.Load(stream);
                        byte[] xmlBinario = System.Text.Encoding.GetEncoding("ISO-8859-1").GetBytes(xdoc.InnerXml);
                        if (!CommandSolicitacao.existeStatusProcFaturamento(guia.identificacaoGuia.numeroGuiaPrestador, idLote))
                            CommandSolicitacao.insereStatusProcedimentoProtocolo(xmlBinario, guia.identificacaoGuia.numeroGuiaPrestador, idLote);
                        else
                            CommandSolicitacao.updateStatusProcFaturamento(xmlBinario, guia.identificacaoGuia.numeroGuiaPrestador, idLote);
                    }
                }
            }
        }
    }
}
